package com.lx.service;

import com.lx.bean.Express;
import com.lx.bean.User;
import com.lx.dao.ExpressDao;
import com.lx.dao.imp.ExpressDaoImpl;
import com.lx.exception.CodeExitException;
import com.lx.util.RandomUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: ExpressService
 * @Description:
 * @Date Created in  2021-07-08 5:34
 * @Modified By:
 * @Author: 零巽
 */
public class ExpressService {
    private static ExpressDao expressDao = new ExpressDaoImpl();

    /**
     * 用于查询全部快递，总数+新增   待取件+新增
     *
     * @return [{size:总数,increment:新增},{size:总数,increment:新增}]
     */

    public static List<Map<String, Integer>> console() {
        return expressDao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit    是否开启分页，true表示是，false表示否（查询所有）
     * @param start    查询的起始索引
     * @param pageSize 分页的页容量
     * @return 查询到的快递集合
     */
    public static List<Express> findAll(boolean limit, int start, int pageSize) {
        return expressDao.findAll(limit,start,pageSize);
    }

    /**
     * 根据快递单号查询快递
     *
     * @param Number 快递单号
     * @return 查询到的快递信息，不存在时返回null
     */
    public static Express findByNumber(String Number) {
        return expressDao.findByNumber(Number);
    }

    /**
     * 根据取件码查询快递
     *
     * @param code 取件码
     * @return 查询到的快递信息，不存在时返回null
     */
    public static Express findByCode(String code) {
        return expressDao.findByCode(code);
    }

    /**
     * 根据用户手机号码查询快递
     *
     * @param UserPhone 手机号码
     * @return 查询到的快递信息，不存在时返回null
     */
    public static List<Express> findByUserPhone(String UserPhone) {
        return expressDao.findByUserPhone(UserPhone);
    }

    /**
     * 根据录入人手机号码查询快递
     *
     * @param SysPhone 手机号码
     * @return 查询到的快递信息，不存在时返回null
     */
    public static List<Express> findBySysPhone(String SysPhone) {
        return expressDao.findBySysPhone(SysPhone);
    }

    /**
     * 快递录入
     *
     * @param express 需要录入的快递
     * @return true表示录入成功，false表示失败
     */
    public static boolean add(Express express){
        //生成取件码
        int code = RandomUtil.getCode();
        express.setCode(code + "");
        try {
           return expressDao.add(express);
        } catch (CodeExitException e) {
            return  add(express);
        }
    }

    /**
     * 快递修改
     *
     * @param id      需要修改的快递id
     * @param express 修改后的快递信息
     * @return true表示录入成功，false表示失败
     */
    public static boolean update(int id, Express express) {
        //手机号变更则进行删除并新增操作
        if (express.getUserPhone() != null) {
            deleteById(id);
            return  add(express);
        } else {
            boolean update = expressDao.update(id, express);
            if (express.getStatus() == 1) {
                Express expressInMySQL = expressDao.findByNumber(express.getNumber());
                changeStatusByCode(expressInMySQL.getCode());
            }
            return update;
        }
    }

    /**
     * 通过id删除快递
     *
     * @param id 需要删除的快递id
     * @return true表示删除成功，false表示失败
     */
    public static boolean deleteById(int id) {
        return expressDao.deleteById(id);
    }

    /**
     * 通过取件码更改快递状态（取件）
     *
     * @param code 快递单号
     * @return true 表示更改成功，false表示失败
     */
    public static boolean changeStatusByCode(String code) {
        return expressDao.changeStatusByCode(code);
    }

    /**
     * 获得用户总排行榜数据的方法
     * @return 【用户名集合，快递数量集合】 （DESC）
     */
    public static List[] getTotalLazyBoard() {
        List[] totalBoard = expressDao.getTotalBoard();
        List<String> phoneList = totalBoard[0];
        List userNameList = new ArrayList();
        for (String phone:phoneList) {
            User user = UserService.findByPhone(phone);
            String userName = user.getUserName();
            userNameList.add(userName);
        }
        totalBoard[0] = userNameList;
        return totalBoard;

    }

    /**
     * 获得用户月排行榜数据的方法
     * @return 【用户名集合，快递数量集合】 （DESC）
     */
    public static List[] getMonthLazyBoard() {
        List[] monthBoard = expressDao.getMonthBoard();
        List<String> phoneList = monthBoard[0];
        List userNameList = new ArrayList();
        for (String phone:phoneList) {
            User user = UserService.findByPhone(phone);
            String userName = user.getUserName();
            userNameList.add(userName);
        }
        monthBoard[0] = userNameList;
        return monthBoard;
    }

    /**
     * 获得用户年排行榜数据的方法
     * @return 【用户名集合，快递数量集合】 （DESC）
     */
    public static List[] getYearLazyBoard() {
        List[] yearBoard = expressDao.getYearBoard();
        List<String> phoneList = yearBoard[0];
        List userNameList = new ArrayList();
        for (String phone:phoneList) {
            User user = UserService.findByPhone(phone);
            String userName = user.getUserName();
            userNameList.add(userName);
        }
        yearBoard[0] = userNameList;
        return yearBoard;
    }
}
